import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.*;

import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;

/**
 * 循环文件夹下的所有视频，在视频上加水印文字
 * 这个版本要用ffmpeg-7.1-essentials_build 这个版本
 * <p>
 *
 * @param null
 * @return
 * @Date: 2024/10/9
 */
public class VideoAddText {

    public static void main(String[] args) {

        HashMap<String, String> map = new HashMap<>();
        // key 输入目录 value 输出目录
        map.put("C:\\Users\\Acer\\Desktop\\处理视频\\1", "C:\\Users\\Acer\\Desktop\\处理视频\\2");
        map.put("C:\\Users\\Acer\\Desktop\\处理视频\\3", "C:\\Users\\Acer\\Desktop\\处理视频\\4");

        for (String key : map.keySet()) {
            // 输入指定视频文件的根目录
            String videoDirectory = key;
            // 输出视频目录
            String outputDirectory = map.get(key);

            String textToAdd = "微信公众号：阿拉升 源码分享网址：www.alsymdd.cn"; // 根据需要修改
            String ffmpegPath = "D:\\software\\FFmpeg\\ffmpeg-7.1-essentials_build\\bin\\ffmpeg.exe";
            // 试了很多次这里要用相对路径，不然会找不到字体文件
            String fontFilePath = "src/main/resources/fonts/simhei.ttf";

            // 创建输出目录
            new File(outputDirectory).mkdirs();

            File dir = new File(videoDirectory);
            File[] files = dir.listFiles((d, name) -> name.endsWith(".mp4"));

            if (files != null) {
                for (File videoFile : files) {
                    String outputFilePath = outputDirectory + File.separator + videoFile.getName();
                    String command = String.format("\"%s\" -i \"%s\" -vf \"drawtext=text='%s':fontcolor=red:fontsize=50:x=(w-text_w-10):y=(h-text_h-10):fontfile='%s'\" -c:v libx264 -crf 18 -preset veryfast -c:a copy \"%s\"",
                            ffmpegPath, videoFile.getAbsolutePath(), textToAdd, fontFilePath, outputFilePath);

                    System.out.println("执行命令: " + command);
                    try {
                        Process process = Runtime.getRuntime().exec(command);

                        // 启动线程读取标准输出
                        new Thread(() -> {
                            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                                String line;
                                while ((line = reader.readLine()) != null) {
                                    System.out.println(line); // 输出信息
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }).start();

                        // 启动线程读取错误输出
                        new Thread(() -> {
                            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
                                String line;
                                while ((line = reader.readLine()) != null) {
                                    System.err.println(line); // 输出错误信息
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }).start();

                        // 检查退出代码
                        int exitCode = process.waitFor();
                        if (exitCode == 0) {
                            System.out.println("处理成功: " + videoFile.getName());
                        } else {
                            System.err.println("处理失败: " + videoFile.getName() + "，退出代码: " + exitCode);
                        }
                    } catch (IOException | InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } else {
                System.out.println("没有找到视频文件。");
            }
        }
    }


    // public static void main(String[] args) {
    //     // 指定视频文件的根目录和文本
    //     String videoDirectory = "E:\\BaiduNetdiskDownload\\text";
    //     String textToAdd = "123456"; // 根据需要修改
    //     String ffmpegPath = "D:\\software\\FFmpeg\\ffmpeg-n5.0-latest-win64-lgpl-shared-5.0\\bin\\ffmpeg.exe";
    //
    //     File dir = new File(videoDirectory);
    //     File[] files = dir.listFiles((d, name) -> name.endsWith(".mp4"));
    //
    //     if (files != null) {
    //         for (File videoFile : files) {
    //             String outputFilePath = videoFile.getParent() + File.separator + "output_" + videoFile.getName();
    //             String command = String.format("\"%s\" -i \"%s\" -vf \"drawtext=text='%s':fontcolor=red:fontsize=36:x=(w-text_w-10):y=(h-text_h-10)\" \"%s\"",
    //                     ffmpegPath, videoFile.getAbsolutePath(), textToAdd, outputFilePath);
    //             System.out.println("执行命令: " + command);
    //             try {
    //                 Process process = Runtime.getRuntime().exec(command);
    //
    //                 // 启动线程读取标准输出
    //                 new Thread(() -> {
    //                     try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
    //                         String line;
    //                         while ((line = reader.readLine()) != null) {
    //                             System.out.println(line); // 输出信息
    //                         }
    //                     } catch (IOException e) {
    //                         e.printStackTrace();
    //                     }
    //                 }).start();
    //
    //                 // 启动线程读取错误输出
    //                 new Thread(() -> {
    //                     try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
    //                         String line;
    //                         while ((line = reader.readLine()) != null) {
    //                             System.err.println(line); // 输出错误信息
    //                         }
    //                     } catch (IOException e) {
    //                         e.printStackTrace();
    //                     }
    //                 }).start();
    //
    //                 // 检查退出代码
    //                 int exitCode = process.waitFor();
    //                 if (exitCode == 0) {
    //                     System.out.println("处理成功: " + videoFile.getName());
    //                 } else {
    //                     System.err.println("处理失败: " + videoFile.getName() + "，退出代码: " + exitCode);
    //                 }
    //             } catch (IOException | InterruptedException e) {
    //                 e.printStackTrace();
    //             }
    //         }
    //     } else {
    //         System.out.println("没有找到视频文件。");
    //     }
    // }


}
